Java 的集合框架提供了一組可以存放、檢索和操作一組資料結構的工具。這些工具涵蓋了陣列(Array)、串列(List)、集合(Collection)、映射(Map)等。
Java 的集合框架位於 java.util 包中,主要分為三個核心介面:List、Set 和 Map。這些介面是集合框架的基礎。每個介面都有不同的實現類,例如 ArrayList、HashSet 和 HashMap。
Collection 這個介面是 Set、List、Queue的父介面,定義了集合的基本操作(如 add、remove 等)。
Map 則是獨立於 Collection 之外的另一個介面。
Collection
/ | \
List Queue Set
| |
ArrayList HashSet
LinkedList TreeSet
Map
|
HashMap
List 是有序的集合,允許元素重複,List中的每個元素都有索引,從 0 開始。
常用的實作類別有:
特性:
1.基於陣列:ArrayList 是一個可變長度的陣列,當需要存儲的元素超過當前容量時,會動態擴展容量。
2.隨機存取快:ArrayList 因為底層是基於陣列結構,所以支援透過索引(get(index))進行快速的隨機存取,因為底層是陣列,透過索引存取元素的時間複雜度為 O(1)。
3.插入和刪除效率低(非尾部操作):在 ArrayList 中,若要在中間位置插入或刪除元素,必須移動後面的元素,這樣的操作時間複雜度為 O(n)。
4.儲存效率高:ArrayList 中的元素是緊密連續地存儲在內存中,因此儲存的空間利用率較高。
import java.util.ArrayList;
public class ListExample {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Orange");
System.out.println("List Elements: " + list);
// output: List Elements: [Apple, Banana, Orange]
System.out.println("Element at index 1: " + list.get(1));
// output: Element at index 1: Banana
}
}
特性:
1.基於鏈表:LinkedList 的每個元素稱為「節點」,節點包含了元素值和指向前後節點的引用。元素不必連續存儲在內存中。
2.插入和刪除效率高:LinkedList 在首尾新增和刪除元素的時間複雜度為 O(1),因為只需要調整指標的引用。但在中間位置插入或刪除元素,需要先遍歷找到該位置,時間複雜度為 O(n)。
3.隨機存取效率低:由於是鏈表結構,訪問某個指定索引的元素需要從頭或尾開始遍歷,這樣的操作時間複雜度為 O(n)。
4.額外的內存開銷:每個節點都需要存儲兩個引用(指向前後節點的引用),因此相對於 ArrayList,LinkedList 需要更多的內存來維持結構。
import java.util.LinkedList;
public class LinkedListExample {
public static void main(String[] args) {
// 建立一個 LinkedList
LinkedList<String> linkedList = new LinkedList<>();
// 新增元素到 LinkedList
linkedList.add("Apple");
linkedList.add("Banana");
linkedList.add("Orange");
// 在開頭插入元素
linkedList.addFirst("Mango");
// 在結尾插入元素
linkedList.addLast("Grapes");
// 輸出整個 LinkedList
System.out.println("LinkedList: " + linkedList);
// output: LinkedList: [Mango, Apple, Banana, Orange, Grapes]
// 取得第一個和最後一個元素
String firstElement = linkedList.getFirst();
String lastElement = linkedList.getLast();
System.out.println("First Element: " + firstElement);
//output: First Element: Mango
System.out.println("Last Element: " + lastElement);
//output: Last Element: Grapes
// 刪除第一個和最後一個元素
linkedList.removeFirst();
linkedList.removeLast();
// 刪除指定元素
linkedList.remove("Banana");
// 輸出刪除後的 LinkedList
System.out.println("刪除後的 LinkedList: " + linkedList);
//output: 刪除後的 LinkedList: [Apple, Orange]
}
}